二分法:返回的条件为当前版本为True且(当前索引为0 或 左边的版本为False)。m * 的作用是避免 m - 1 为负数,如果 m 为 0,则代表左边没有版本,只需判断当前版本是否为 True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
l, h = 1, n while l <= h: m = (l + h) // 2 # 感觉判断不太一样? if isBadVersion(m) > m * isBadVersion(m - 1): return m elif isBadVersion(m): h = m - 1 else: l = m + 1 # 更加正常一点的判断?但是居然超时了 if isBadVersion(m): h = m else: l = m + 1 return l